約 2,855,517 件
https://w.atwiki.jp/bambooflow/pages/115.html
SystemC波形出力 SystemC波形出力VCD波形ファイル出力 WIF波形出力 波形表示ツール波形表示ツール(GTKWave) for Linux,Cygwin 波形表示ツール(Wave VCD) for Windows 波形表示ツール(CvSDL) for Windows 波形出力の設定は、sc_mainとか、検証環境用のファイル内に記述する。 簡単なのはsc_main内に記述する方法。 TLMベースでは波形はほとんど見ないと思う。BCAのバス設計時は見ると思う。 sc_trace sc_trace_filevcd_trace_file wif_trace_file VCD波形ファイル出力 sc_main記述例 #include systemc.h #include "TOP.h" int sc_main(int argc, char* argv[]) { sc_clock CLK( "CLK", 10, SC_NS ); TOP *top = new TOP("TOP"); // モジュール実体化 #ifdef SYSC_DUMP_VCD_FILE sc_trace_file *trace_f; trace_f = sc_create_vcd_trace_file( "systemc" ); // 出力ファイル名を指定する(systemc.vcd) //((vcd_trace_file*)trace_f)- sc_set_vcd_time_unit(-9); // ns(ナノ秒)単位 trace_f- set_time_unit( 1.0, SC_NS ); // timescale 1ns(ナノ秒)単位 (v2.2.0) sc_trace( trace_f, CLK, "CLK" ); //CLKを波形ファイル出力として指定 sc_trace( trace_f, TOP- in_data, "TOP.in_data" ); //下位階層の信号を指定 // sc_trace ・・・ #endif // SYSC_DUMP_VCD_FILE sc_start(); // シミュレーション開始 #ifdef SYSC_DUMP_VCD_FILE sc_close_vcd_trace_file( trace_f ); #endif // SYSC_DUMP_VCD_FILE return 0; } TOPモジュールの実体化(すべてのモデル実体化)のあとに設定する。 sc_start()実行よりも前に設定する。 波形出力できるのは、sc_in , sc_out , sc_signal で普通の変数は表示できない。 シミュレーション実行が終了すると、波形ファイル"systemc.vcd"が出力される。 波形出力の有無の切り替えを#ifdef ~#endifでできるようにすると検証しやすくなる。 Makefileのコンパイルオプションで"-DSYSC_DUMP_VCD_FILE"をつけると波形ファイルが出力される。 WIF波形出力 この波形ファイル形式はよく知らない。 とりあえずVCDと同じように設定すればよい。 以下の点が異なる。単純に"vcd"だったのを"wif"とすればよい。 sc_trace_file *trace_f; trace_f = sc_create_wif_trace_file( "systemc" ); // 出力フェイル名を指定する //((wif_trace_file*)trace_f)- sc_set_vcd_time_unit(-9); // ns(ナノ秒)単位 trace_f- set_time_unit( 1.0, SC_NS ); // 1ns(ナノ秒)単位 (v2.2.0) ・・・ sc_close_wif_trace_file(tf);
https://w.atwiki.jp/bambooflow/pages/124.html
SystemCのデバッグ SystemCのデバッグ信号接続(バインド)の失敗について マクロ定義 sc_mainの初期表示 時間表示 モジュール名の表示 プロセス表示 sc_assertの使用 sc_reportレポートの種類 使用例 sc_report_handler モジュール内のレポート記述SC_REPORT_INFO SC_REPORT_WARNING SC_REPORT_ERROR使用例 SC_REPORT_FATAL使用例 信号接続(バインド)の失敗について コンパイルは通ったが、シミュレーションしようと実行したら、次のようなエラーが出た。 Error (E109) complete binding failed port not bound port mod.port_1 (sc_in) In file ../../../../src/sysc/communication/sc_port.cpp 265 原因は、sc_in もしくはsc_out の接続ミス。 次のようなとき、このエラーが出力される。 sc_main.cpp #include systemc.h #include "mod.h" int sc_main(int argc, char* argv[]) { sc_signal unsigned int sig_a; sc_signal unsigned int sig_b; sc_signal unsigned int sig_c; mod mod0( "mod0" ); mod0.a( sig_a ); //mod0.a( sig_b ); // 接続していない mod0.a( sig_c ); sc_start( 10, SC_US ); return 0; } mod.h SC_MODULE( mod ) { sc_in unsigned int a; sc_in unsigned int b; sc_in unsigned int c; ・・・ }; 今回の場合は、modモジュールのbというsc_in ポートに対して、チャネル(sc_signal )が接続されていないことが原因。 modで信号の宣言が上から順に"a", "b", "c""となっているが、エラーで"port not bound port mod.port_1 "と表示されていたら、上から数えて2番目の信号”b”が接続ミスだとわかる。 もし、"mod.port0"と表示されたら、1番目の信号"a"が接続ミスだとわかる。 シミュレーション開始前にあるエラボレーションのフェースで信号の接続等の確認を行う。 sc_in 、sc_out を宣言したら、宙ぶらりんにしないこと。かならず、sc_signal もしくはsc_buffer と接続すること。 マクロ定義 Ver2.1 SYSTEMC_VERSION = 20050714 SC_RELEASE_STRING = "2.1.v1" SC_API_VERSION_STRING sc_api_version_2_1_0 Ver2.2 SYSTEMC_VERSION = 20070314 sc_mainの初期表示 sc_version() = SystemC 2.1.v1 --- May 18 2008 17 13 45 sc_copyright()= Copyright (c) 1996-2005 by all Contributors ALL RIGHTS RESERVED 時間表示 #include systemc.h #include iomanip #ifndef DEBUG_TIME #define DEBUG_TIME std setw(8) std right sc_time_stamp() "(" std dec std setw(6) sc_delta_count() ") " #endif 使用例 cout DEBUG_TIME "example output time" endl; 表示 0 s( 0) example output time モジュール名の表示 printf("%s\n", this- name()); // 階層構造を含むオブジェクト名 printf("%s\n", this- basename()); // 自オブジェクト名のみ プロセス表示 #ifndef DEBUG_PROCESS #if SYSTEMC_VERSION = 20060606 // Sysc v2.2 #define DEBUG_TIME sc_get_current_process_handle().name() " " this- name() " " #else #define DEBUG_PROCESS sc_get_curr_process_handle()- name() " " this- name() " " #endif #endif 使用例 cout DEBUG_PROCESS" "example output process" endl; 表示 TOP0.DUT0.thread_proc TOP.DUT0 example output process sc_assertの使用 ・・・ TopModule top = new TopModule( "top" ); sc_assert( top ); // topがNULLだと異常終了となる ・・・ 異常終了の表示例 Fatal (F4) assertion failed top In file main.cpp 14 アボートしました sc_report レポートの種類 sc_severityエラーレベルは以下の4つ。 重大度 説明 SC_INFO 情報出力 SC_WARNING 警告、問題である可能性がある SC_ERROR 重大な問題 SC_FATAL 致命的な問題でシミュレーションを終了 sc_reportによりアクセスする 使用例 try { ... SC_REPORT_ERROR("msg_type", "msg"); ... } catch ( sc_report e ) { std cout "Caught " e.what() std endl; } sc_report_handler sc_report_handler モジュール内のレポート記述 SC_REPORT_INFO SC_REPORT_WARNING SC_REPORT_ERROR使用例 std ostringstream msg; // log message msg.str (""); msg " Not supported yet."; SC_REPORT_ERROR(filename, __FUNCTION__, msg.str()); SC_REPORT_FATAL使用例 SC_REPORT_FATAL( "TLM2", "not supported." );
https://w.atwiki.jp/bambooflow/pages/140.html
SystemC 動的プロセスについて メソッドを動的にSC_METHODやSC_THREAD指定することが可能。 普通のモデリング時には必要ないが、応用的なことに使用することがある。 たとえば、デバッグ機能を追加したい、とか、検証機能を強化したい、とか。 以下にその方法をメモる。 SystemC 動的プロセスについて動的プロセスを扱うための準備 使用する関数 動的methodを指定する記述例 動的threadを指定する記述例 動的プロセスを扱うための準備 以下のようにsytemc.hをインクルードする前にSC_INCLUDE_DYNAMIC_PROCESSESを定義する必要がある。 #define SC_INCLUDE_DYNAMIC_PROCESSES #include systemc.h もしくは、コンパイルオプションの "-D"を使用する方法もある。 g++ -I/usr/local/systemc-2.2 -DSC_INCLUDE_DYNAMIC_PROCESSES -c model.cpp 使用する関数 sc_spawn プロセスを指定するときに使用する。 sc_bind プロセスとする関数を指定するときに使用する。 sc_bindはboost bindのdefine定義。 sc_spawn_options プロセスのオプション設定をする。たとえば、センシティブ指定とか。 戻り値なしで登録する場合 sc_process_handle hname = sc_spawn( /*void*/sc_bind( funcName, ARGS... ), char* processName, sc_spawn_options spawnOptopns ); sc_process_handle hname = sc_spawn( /*void*/sc_bind( funcName, object, ARGS... ), char* processName, sc_spawn_options spawnOptopns ); 戻り値ありで登録する場合 sc_process_handle hname = sc_spawn( returnVar, sc_bind( funcName, ARGS... ), char* processName, sc_spawn_options spawnOptopns ); sc_process_handle hname = sc_spawn( returnVar, sc_bind( funcName, object, ARGS... ), char* processName, sc_spawn_options spawnOptopns ); 動的methodを指定する記述例 #define SC_INCLUDE_DYNAMIC_PROCESSES #include systemc.h SC_MODULE( DUT ) { sc_in sc_uint 8 din1; sc_in sc_uint 8 din2; sc_out sc_uint 9 dout; SC_CTOR( DUT ) { SC_THREAD( init_thread ); } void init_thread() { sc_spawn_options mth; mth.spawn_method(); mth.dont_initialize(); mth.set_sensitivity( din1 ); mth.set_sensitivity( din2 ); sc_spawn( sc_bind( DUT spawn_method0,this), "method0", mth ); } void spawn_method0() { dout.write( din1.read() + din2.read() ); } }; 注意として、sc_spawnの指定は、プロセス内に記述する。 コンストラクタに記述すると実行時エラーとなる。 動的threadを指定する記述例 #define SC_INCLUDE_DYNAMIC_PROCESSES #include systemc.h SC_MODULE( DUT ) { sc_in bool clk; SC_CTOR( DUT ) { SC_THREAD( run ); } void run() { sc_spawn_options opt; opt.set_sensitivity( clk.pos() ); sc_spawn( sc_bind( DUT spawn_thread,this, false ), "thread0", opt ); } void spawn_thread( bool flag ) { while (true) { ・・・ wait(); } } }; 動的プロセスでは引数を渡したり戻り値を受け取ったりするができる。 例では、bool型の引数を渡している。
https://w.atwiki.jp/bambooflow/pages/110.html
SystemCによるRTL記述 SystemCによるRTL記述Verilog-HDLとSystemC記述の対比一覧 RTLから抽象度をあげるには Verilog-HDLとSystemC記述の対比一覧 SystemCでは、はば広い抽象度で記述できる。 RTL記述も可能。 Verilog-HDL記述は、SystemCでは、以下のように(RTL)記述できる。 Verilog-HDL記述 SystemCでは 備考 module M;~endmodule SC_MODULE(M) {~}; モジュール定義 input [7 0] in_data; sc_in 8 in_data; 入力信号 output [15 0] out_data; sc_out 16 out_data; 出力信号 reg [31 0] tmp_reg; sc_uint 32 tmp_reg;もしくはsc_signal sc_uint 32 tmp_reg; 1つのプロセス内ならデータ型プロセス間通信ならsc_signal を使う wire [31 0] mm2mn_data; sc_signal 32 mm2mn_data; モジュール間信号接続 always @ (posedge(clk))begin~end SC_METHOD(method);sensitive clk.pos();void method() {~} FF推定 always @ (a or b)begin~end SC_METHOD(method);sensitive a b;void method() {~} 組み合わせ initial begin~end SC_THREAD(thread);void thread() {~} assign文 なし methodの組み合わせで表現 # 10 //ns wait(10,SC_NS) 遅延 @(posedge(clk)) wait(); クロック立ち上がりを待つ parameter width=5; const unsigned width=5; x[m n] x.range(m,n) ビットアクセス {x, y} (x, y) 連節 ただし、SystemCでRTL記述をしても、あまり利点がない。 シミュレーション速度は逆にSystemCのほうが遅くなるかもしれない。 RTLから抽象度をあげるには 以下の点を実施すると抽象度があがっていくはず。 SC_METHODからSC_THREADを使用する クロック信号を使わない プロセス関数を少なくする waitの数を少なくする ステートマシンを記述しない 入出力信号をsc_fifo等を使用する(関数でデータの受け渡しをする) 抽象度をあげることで、SW協調モデルとして利用性が高くなる。 SW協調モデルに求められるのは、タイミング精度はそこそこで、シミュレーション速度が優先。TLMレベル。
https://w.atwiki.jp/bambooflow/pages/144.html
コアとなる言語クラス定義 コアとなる言語クラス定義ヘッダファイル コアクラス一覧 用意されたチャネルクラス定義チャネルクラス一覧 チャネル接続の対応表 ヘッダファイル SystemCを使うには次のヘッダファイルをインクルードする。 #include "systemc.h" #include "systemc.h" #include "systemc" #include "systemc" using sc_core sc_module; using sc_core sc_signal; using sc_core SC_NS; using sc_core sc_start; using sc_dt sc_logic; #include iostream using std ofstream; using std cout; using std endl; コアクラス一覧 sc_module sc_module_name sc_sensitive sc_spawn_optionsとsc_spawn sc_process_handle sc_event_finderとsc_event_finder_t sc_event_and_listとsc_event_or_list sc_evnet sc_time sc_port sc_export sc_interface sc_prim_channel sc_object sc_attr_base sc_attribute sc_attr_cltn 用意されたチャネルクラス定義 チャネルクラス一覧 sc_signal_in_if sc_signal_in_if<bool>とsc_signal_in_if<sc_dt sc_logic> sc_signal_inout_if sc_signal sc_signal<bool>とsc_signal<sc_dt sc_logic> sc_buffer sc_clock sc_in sc_in<bool>とsc_in<sc_dt logic> sc_inout sc_inout<bool>とsc_inout<sc_dt sc_logic> sc_out sc_signal_resolved sc_in_resolved sc_sc_inout_resolved sc_out_resolved sc_signal_rv sc_in_rv sc_inout_rv sc_out_rv sc_fifo_in_if sc_fifo_out_if sc_fifo sc_fifo_in sc_fifo_out sc_mutex_if sc_mutex sc_semaphore_if sc_semaphore sc_event_queue チャネル接続の対応表 入力 チャネル 出力 sc_port sc_signal_in_if X sc_signal X sc_buffer X sc_port sc_signal_out_if X sc_port sc_signal_inout_if X sc_port sc_signal_inout_if X sc_in X sc_out X sc_inout X sc_inout X sc_in bool sc_clock sc_in_resolved sc_signal_resolved sc_out_resolved sc_inout_resolved sc_inout_resolved sc_in_rv W sc_signal_rv W sc_out_rv W sc_inout_rv W sc_inout_rv W sc_port sc_fifo_in_if X sc_fifo X sc_port sc_fifo_out_if X sc_fifo_in X sc_fifo_out X X 型(bool,unsigned char,int,sc_uint , sc_int , etc.) W ビット幅 アクセス チャネル sc_port sc_mutex_if sc_mutex sc_port sc_semaphore_if sc_semaphore
https://w.atwiki.jp/bambooflow/pages/164.html
SytemCで固定小数点 固定小数点の使い方についてメモしておく。 忘れっぽいので。。。 IEEE1666のLRMを見るとグラフつきでわかりやすいかも。 SytemCで固定小数点 種類 テンプレート・パラメータ量子化モード(誤差)SC_RND SC_RND_ZERO SC_RND_MIN_INF SC_RND_INF SC_RND_CONV SC_TRN (デフォルト) SC_TRN_ZERO オーバーフローモードSC_SAT SC_SAT_ZERO SC_SAT_SYM SC_WRAP (デフォルト) SC_WRAP_SM 固定小数点のコンパイル 使い方例オーバーフロー有無の確認 固定小数点 == sc_uint変換 種類 符号付固定小数点sc_dt sc_fixed W, I, Q, O, N 符号なし固定小数点sc_dt sc_ufixed W, I, Q, O, N よく使うのは、sc_fixed、sc_ufixedの2つだけ。 他はあまり使わない。。。 高速版、符号付固定小数点sc_dt sc_fixed_fast W, I, Q, O, N 高速版、符号なし固定小数点sc_dt sc_ufixed_fast W, I, Q, O, N 高速版は、32ビットOSにおいて、途中の計算を53ビットに制限して(double)高速化を実現しているらしい。 精度は落ちるかもしれないので、よく検討するべし。 動的サイズ:符号付固定小数点sc_dt sc_fix 動的サイズ:符号なし固定小数点sc_dt sc_ufix 動的サイズ、高速版:符号付固定小数点sc_dt sc_fix_fast 動的サイズ、高速版:符号なし固定小数点sc_dt sc_ufix_fast sc_fixed(テンプレート型)とsc_fix(テンプレート型)の違いがある。 テンプレート・パラメータ パラメータ 値の型 説明 W int(正の値) 全体のビット幅(ワード長) I int 整数部のビット幅、正負の値が指定できる Q sc_q_mode 量子化モード(省略可) O sc_o_mode オーバーフローモード(省略可) N int オーバーフロー用ビット数(省略可、Oのためのオプション) 量子化モード(誤差) 第3番目のパラメータで丸め方向を決めることができる。 sc_q_mode SC_RND 正の無限方向への丸め SC_RND_ZERO ゼロ方向への丸め SC_RND_MIN_INF 負の無限方向への丸め SC_RND_INF 無限方向への丸め SC_RND_CONV 収束丸め SC_TRN(デフォルト) 切捨て SC_TRN_ZERO ゼロ方向へ切捨て SC_RND 正の方向への丸め (rounding to plus infinity) 例) y = sc_fixed 3,2,SC_RND (x); 代入前[ x ] 代入後[ y ] -側 0b10.11 (-1.25) 0b11.0 (-1.0) +側 0b01.01 ( 1.25) 0b01.1 ( 1.5) LSB-1番目のビットが、1ならば上へ、0ならば下へ。 SC_RND_ZERO ゼロ方向への丸め (rounding to zero) 例) y = sc_fixed 3,2,SC_RND_ZERO (x); 代入前[ x ] 代入後[ y ] -側 0b10.11 (-1.25) 0b11.0 (-1.0) +側 0b01.01 ( 1.25) 0b01.0 ( 1.0) SC_RND_MIN_INF マイナス方向への丸め (rounding to minus infinity) 例) y = sc_fixed 3,2,SC_RND_MIN_ZERO (x); 代入前[ x ] 代入後[ y ] -側 0b10.11 (-1.25) 0b10.1 (-1.5) +側 0b01.01 ( 1.25) 0b01.0 ( 1.0) SC_RND_INF 無限方向への丸め (rounding to infinity) 例) y = sc_fixed 3,2,SC_RND_ZERO (x); 代入前[ x ] 代入後[ y ] -側 0b10.11 (-1.25) 0b10.1 (-1.5) +側 0b01.01 ( 1.25) 0b01.1 ( 1.5) SC_RND_CONV 収束丸め (convergent rounding) 例) y = sc_fixed 3,2,SC_RND_CONV (x); 代入前[ x ] 代入後[ y ] -側 0b10.11 (-1.25) 0b11.0 (-1.0) +側 0b01.01 ( 1.25) 0b01.0 ( 1.0) 0b10.11(-1.25) = x = 0b11.01(-0.75) y = 0b11.0(-1.0) 0b11.10(-0.75) x 0b11.11(-0.25) y = 0b11.1(-0.5) 0b11.10(-0.25) = x = 0b00.01( 0.25) y = 0b00.0( 0.0) 0b00.01( 0.25) x 0b00.11( 0.75) y = 0b00.0( 0.5) 0b00.11( 0.75) = x = 0b01.01( 1.25) y = 0b01.0( 1.0) ( =, =)と( , )とが交互。奇数と偶数とで異なる。 Convergent Roundingは特定の用途に用いられるらしい。 SC_TRN (デフォルト) 切捨て (truncation) 例) y = sc_fixed 3,2,SC_TRN (x); 代入前[ x ] 代入後[ y ] -側 0b10.11 (-1.25) 0b10.1 (-1.5) +側 0b01.01 ( 1.25) 0b01.0 ( 1.0) これは、デフォルト。 計算は切捨てなので高速だが、精度が出ない。 精度をあげるならば、SC_RNDを使う。 SC_TRN_ZERO ゼロ方向へ切捨て (truncation to zero) 例) y = sc_fixed 3,2,SC_TRN_ZERO (x); 代入前[ x ] 代入後[ y ] -側 0b10.11 (-1.25) 0b11.0 (-1.0) +側 0b01.01 ( 1.25) 0b01.0 ( 1.0) オーバーフローモード オーバーフローを起こした場合、4番目と5番目のパラメータにより調整することができる。 種類は、飽和もしくは折り返しがある。 sc_o_mode SC_SAT 単純飽和 SC_SAT_SYM 対称飽和 SC_SAT_ZERO ゼロ飽和 SC_WRAP(デフォルト) 折り返し SC_WRAP_SM sign magnitude折り返し 単純飽和は、最大値を超えたら最大値まで減少、最小値を下回ったら最小値まで増加させる。 対称飽和は、最大値側は単純飽和とおなじ。最小値を下回ったら"-最大値"まで増加させる。 ゼロ飽和は、オーバーフローを起こしたら、値をゼロにする。 折り返しは、収まらない上位ビットを削除。 パラメータNでを使用する。 SC_SAT 単純飽和 例) y = sc_fixed 3,3,SC_SAT (x) 代入前[ x ] 代入後[ y ] 備考 -側 -6 -4 オーバーフロー -5 -4 オーバーフロー -4 -4 -3 -3 -2 -2 -1 -1 0 0 1 1 2 2 3 3 4 3 オーバーフロー +側 5 3 オーバーフロー 上限よりも下限の飽和する絶対値は異なることに注意。 SC_SAT_ZERO ゼロ飽和 例) y = sc_fixed 3,3,SC_SAT_ZERO (x) 代入前[ x ] 代入後[ y ] 備考 -側 -6 0 オーバーフロー -5 0 オーバーフロー -4 -4 -3 -3 -2 -2 -1 -1 0 0 1 1 2 2 3 3 4 0 オーバーフロー +側 5 0 オーバーフロー オーバーフローすると、ゼロ値となる。 SC_SAT_SYM 対称飽和 例) y = sc_fixed 3,3,SC_SAT_SYM (x) 代入前[ x ] 代入後[ y ] 備考 -側 -6 -3 オーバーフロー -5 -3 オーバーフロー -4 -3 オーバーフロー -3 -3 -2 -2 -1 -1 0 0 1 1 2 2 3 3 4 3 オーバーフロー +側 5 3 オーバーフロー -側のオーバーフロー値は、+側の絶対値と同じとなる。 SC_WRAP (デフォルト) ラップアラウンド。~ n_bit=0 n_bit 0 SC_WRAP_SM 符号つき絶対値ラップアラウンド n_bits=0 n_bits 0 固定小数点のコンパイル SC_INCLUDE_FXをsystemc.hをインクルードする前に定義する必要がある。 これがないと、コンパイルが通らずエラーとなる。 #define SC_INCLUDE_FX #include "systemc.h" もしくは、コンパイル時に"-D"で指定する。 -DSC_INCLUDE_FX 関連 SC_FX_EXCLUDE_OTHER 使い方例 オーバーフロー有無の確認 sc_fixed 4,4 a(1.0); // ワード長4ビット,整数4ビット sc_fixed 4,4 b(1.0); sc_fixed 4,4 c(8.0); sc_fixed 4,4 d(8.0); sc_fixed 4,4 z; cout "o_flag = " z.overflow_flag() endl; z = a * b; // 1.0 x 1.0 = 1.0 オーバーフローなし cout "z = " z endl; cout "o_flag = " z.overflow_flag() endl; z = c * d; // 8.0 x 8.0 = 64.0 オーバーフロー発生 cout "z = " z endl; cout "o_flag = " z.overflow_flag() endl; 結果 o_flag = 0 z = 1 o_flag = 0 z = 0 o_flag = 1 = オーバーフロー発生を確認 固定小数点 == sc_uint変換 よさそうな方法が思いつかないので、とりあえず。 sc_fixed == sc_uint 変換 sc_fixed 4,2 1(1.25); // 1.25 (0b01.01) sc_uint 4 x, y; x = a; // 1.00 (0b00001), 整数部のみを代入 y = a.range( a.wl()-1, 0 ); // 5 (0b00101), ビット列を単純代入 sc_uint == sc_fixed 変換 sc_uint 4 a(5); // 5 (0b00101) sc_fixed 6,4 x; sc_fixed 4,2 y; x = a; // 5.00 (0b0101.00), 整数として代入 y.range( y.wl()-1, 0 ) = a; // 1.25 (0b01.01), ビット列を単純代入
https://w.atwiki.jp/bambooflow/pages/112.html
SystemC関連の歴史 SystemCの歴史はまだ浅い。 以下に簡単にメモ。(間違っているかもしれないが) OSCI(オスキー) 標準化団体でSystemCの言語やモデリング・スタイル、ライブラリなどの標準化を行っている。 TLM普及・標準化団体には、 OSCI OCP-IP GreenSocs などがある。 抽象度の統一化がまだされていない。 過去 1999年9月、Open SystemC Initiative(OSCI)発足 2000年4月、SystemC ver1.0 リリース 2001年10月、SystemC ver2.0 リリース 2003年ころ、ハードウエア記述用のC言語系としてSystemCが業界標準として認知 2005年4月、TLM-1.0 公開 2005年5月、SystemC ver2.1 リリース 2005年12月、IEEE1666標準化「IEEE Std.1666-2005」(SystemC v2.1の範囲) 2006年12月、TLM2.0 Draft Kit(TLM2.0 Draft1 公開 2007年3月、SystemC ver2.2.0 リリース 2007年10月、TLM2.0 Draft2 公開 2008年6月、TLM2.0 公開 2008年6月、OSCI SystemC AMS Extensionsホワイト・ペーパー公開 今後(ロードマップ) 2008年末までに、TLM2.0 LRM公開 2008年末までに、AMS Extensions LRM公開 2009年?、TLM2.1 公開、IEEE標準化へ 20XX年、SystemC ver3、リアルタイムOSモデル 20XX年、SystemC ver4、デジタルとアナログ混在のミックスト・シグナル・モデル
https://w.atwiki.jp/bambooflow/pages/134.html
SystemC HelloWorld - 始めの一歩 SystemCライブラリのインストールが完了したら、とりあえず実行できるか確認してみる。 「Hello, SystemC!!!」を表示するプログラム。 ここでは、Linuxインストールで/user/local/systemc-2.2/にインストールしたとする。 SystemC HelloWorld - 始めの一歩プログラム内容 サンプル コンパイル/実行 まとめ プログラム内容 main.cpp #include systemc.h int sc_main( int argc, char* argv[] ) { cout "Hello, SystemC!!!" endl; return 0; } "systemc.h"のインクルードする メインは"sc_main"を使用する sc_mainはSystemCのメイン関数となっている。実際のc++のメイン関数であるmainはライブラリ内に存在する。main関数はsc_main.cppに存在する。ここで、sc_elab_and_simが呼ばれて、その中で、sc_mainが実行される。実行したときに最初にSystemCのバージョン等が表示される。これはsc_elab_and_sim内でplnにより表示されている。 SystemCのバージョンv2.2では、インクルードで".h"を抜いた書き方ができる。 その場合は以下のようになる。 #include systemc using namespace sc_core; using namespace sc_dt; using namespace std; サンプル hello.tgz main.cpp Makefile コンパイル/実行 $ make g++ -Wall -I. -I/usr/local/systemc-2.2/include -c main.cpp g++ -Wall -I. -I/usr/local/systemc-2.2/include -L. -L/usr/local/systemc-2.2/lib-linux -o run.x main.o -lsystemc -lm $ ./run.x 結果表示 SystemC 2.2.0 --- Jun 28 2008 10 19 12 Copyright (c) 1996-2006 by all Contributors ALL RIGHTS RESERVED Hello, SystemC!!! まとめ ここでは、SystemCのインストールがうまくいったかどうかとコンパイルが正しくできるかを確認した。 SystemCを理解するためには次を覚える。 モジュール定義方法 信号の定義と接続方法 プロセス(並列処理)の定義方法 スレッド間の同期について システム時間とシミュレーション時間について シミュレーションの開始と終了
https://w.atwiki.jp/bambooflow/pages/136.html
SystemC 並列処理動作について ここでは、SystemCの機能のひとつである並列処理動作について説明する。 2つのプロセスを作り、並列動作を体感してみる。 SystemC 並列処理動作についてサンプル プログラム 実行結果 説明 サンプル multi_process.tgz main.cpp Makefile プログラム main.cpp #include systemc.h SC_MODULE( MyModel ) { // constructor SC_CTOR( MyModel ) { SC_THREAD( thread0 ); SC_THREAD( thread1 ); } // process0 void thread0() { while (true) { cout "----thread0----------" endl; wait( 10.0, SC_US ); } } // process1 void thread1() { while (true) { cout "-----------thread1---" endl; wait( 10.0, SC_US ); } } }; int sc_main( int argc, char* argv[] ) { MyModel *myModel; // module instance myModel = new MyModel( "MyModel" ); sc_assert( myModel ); ///////////////////////////////////////////////////////////////////////// // initialize sc_start( SC_ZERO_TIME ); cout "now time is " sc_time_stamp() endl; // simulation sc_start( 10.0, SC_US ); cout "now time is " sc_time_stamp() endl; sc_start( 10.0, SC_US ); cout "now time is " sc_time_stamp() endl; sc_start( 100.0, SC_US ); cout "now time is " sc_time_stamp() endl; sc_start( 50.0, SC_US ); cout "now time is " sc_time_stamp() endl; ///////////////////////////////////////////////////////////////////////// delete myModel; return 0; } 実行結果 SystemC 2.2.0 --- Jul 1 2008 00 09 35 Copyright (c) 1996-2006 by all Contributors ALL RIGHTS RESERVED ----thread0---------- -----------thread1--- now time is 0 s now time is 10 us ----thread0---------- -----------thread1--- now time is 20 us -----------thread1--- ----thread0---------- -----------thread1--- ・・・ ----thread0---------- -----------thread1--- ----thread0---------- now time is 120 us ----thread0---------- -----------thread1--- ----thread0---------- ・・・ -----------thread1--- ----thread0---------- -----------thread1--- now time is 170 us 説明 このプログラムではMyModelというSC_MODULEを1つ定義してsc_main()でインスタンスしている。 このMyModelは2つのプロセスをもつ。プロセス名は、thread0とthread1。 この2つのプロセスは、シミュレーション開始(sc_start)とともに実行される。 ここで、注目してほしいことは、thread0とthread1はどちらもwhile(true){}の無限ループを構成していること。 SC_THREADの処理はwaitによりいったん停止することができる。 wait( 10.0, SC_US ); この記述は、ここで処理を一端停止し、シミュレーション時間が10us進んだらこのwaitを抜けて続きの処理をするものである。第1引数はdouble型、第2引数は時間の単位を指定する。 時間の単位はSC_SEC(秒)からSC_FS(フェムト秒)まで指定できる。 今回は、SC_US(マイクロ秒)を単位として指定した。 thread0とthread1のwaitの時間はともに10usなのでどちらの処理が先に実行されるかはわからない。 どちらが先に処理されるかの順番はSystemCでは保証されない。 実行結果をみるとsc_start()を実行するたびにthread0とthread1の実行の順番が入れ替わっていることに注目してほしい。 プロセスは、posixもしくはpthreadというCライブラリのスレッド・モデルを利用して実現しているようだ。
https://w.atwiki.jp/bambooflow/pages/75.html
SystemC用語 OSCI(Open SystemC Initiative) SystemCの標準化を行っている組織。 TLM(Transaction Level Moeling) トランザクション・レベル・モデリング。 データの流れを主体としたシステムレベル。このレベルではハードウェアの詳細な設計までは行わない。 TLMはSystemCで主に使われる。 TLMはRTLに比べて抽象度が高く、シミュレーションも高速に実行できる利点がある。 動作合成(Behavioral Synthesis,ビヘイビア合成) SystemC(C++)記述からRTLを生成する。 専用のツールを必要とする。